package com.shanghe.house.util;

import org.springframework.scheduling.support.CronExpression;

import java.time.LocalDateTime;

public class TimeUtils {
    /**
     * 将分钟数转换为cron表达式
     * @param minutes 分钟数
     * @return cron表达式
     */
    public static String minutesToCron(int minutes) {
        if (minutes <= 0) {
            throw new IllegalArgumentException("分钟数必须大于0");
        }
        // 如果分钟数小于60，使用每隔N分钟执行一次的格式
        if (minutes < 60) {
            return String.format("0 0/%d * * * ?", minutes);
        }
        // 如果分钟数大于等于60，转换为小时
        int hours = minutes / 60;
        int remainingMinutes = minutes % 60;
        if (hours < 24) {
            if (remainingMinutes == 0) {
                return String.format("0 0 0/%d * * ?", hours);
            } else {
                return String.format("0 %d 0/%d * * ?", remainingMinutes, hours);
            }
        }
        throw new IllegalArgumentException("时间间隔不能超过24小时");
    }

    /**
     * 将cron表达式转换为分钟数
     * @param cronExpression cron表达式
     * @return 分钟数
     */
    public static int cronToMinutes(String cronExpression) {
        if (!CronUtils.isValid(cronExpression)) {
            throw new IllegalArgumentException("无效的cron表达式");
        }
        
        String[] parts = cronExpression.split(" ");
        // 解析分钟和小时部分
        String minutes = parts[1];
        String hours = parts[2];
        
        if (minutes.contains("/")) {
            // 处理每隔N分钟的情况
            return Integer.parseInt(minutes.split("/")[1]);
        } else if (hours.contains("/")) {
            // 处理每隔N小时的情况
            int hourInterval = Integer.parseInt(hours.split("/")[1]);
            int minute = minutes.equals("0") ? 0 : Integer.parseInt(minutes);
            return hourInterval * 60 + minute;
        }
        
        throw new IllegalArgumentException("不支持的cron表达式格式");
    }

    /**
     * 获取下一次执行时间
     * @param minutes 分钟数
     * @return 下一次执行时间
     */
    public static LocalDateTime getNextExecuteTime(int minutes) {
        String cron = minutesToCron(minutes);
        CronExpression cronExpression = CronExpression.parse(cron);
        return cronExpression.next(LocalDateTime.now());
    }
} 